

#include "include/muduo/net/TcpConnection.h"
#include "include/muduo/net/TcpServer.h"
#include "include/muduo/net/EventLoop.h"
#include <iostream>
#include <string>
#include <unordered_map>
#include <functional>

class TranslateServer
{
public:
    TranslateServer(int port)
        : _server(&_loop, muduo::net::InetAddress("0.0.0.0", port), "TranslateServer",
                  muduo::net::TcpServer::kReusePort) // 开启端口号重用
    {
        //绑定建立连接成功的回调函数
        auto func=std::bind(&TranslateServer::onConnection,this,std::placeholders::_1);
        _server.setConnectionCallback(func);
        //绑定收到消息的回调函数
        auto func1=std::bind(&TranslateServer::onMessage,this,
                            std::placeholders::_1,std::placeholders::_2,std::placeholders::_3);
        _server.setMessageCallback(func1);
    }
    //启动服务器
    void start()
    {
        _server.start();//开始监听新的连接
        _loop.loop();//开始事件监听
    }
private:
    // 新连接建立成功的回调函数
    void onConnection(const muduo::net::TcpConnectionPtr &conn)
    {
        if(conn->connected())
        {
            std::cout<<"新连接建立成功！！！"<<std::endl;
        }
        else
        {
            std::cout<<"连接断开"<<std::endl;
        }
    }
    std::string translate(std::string str)
    {
        static std::unordered_map<std::string,std::string> dict_map={
            {"hello","你好"},
            {"Hello","你好"},
            {"你好","hello"},
            {"ILoveYou","奥迪a6"}
        };
        auto it=dict_map.find(str);
        if(it!=dict_map.end())
        {
            return it->second;
        }
        return "unkown\n";
    }
    // 收到消息时的回调函数
    void onMessage(const muduo::net::TcpConnectionPtr &conn, muduo::net::Buffer *buf, muduo::Timestamp)
    {
        //1，从buf中取出数据
        std::string str=buf->retrieveAllAsString();
        //2,进行业务处理——翻译
        std::string res=translate(str);
        //3,向客户端进行响应 
        conn->send(res);
    }
private:
    // 注意声明顺序,_loop要作为_server的参数
    muduo::net::EventLoop _loop;   // 事件监听，事件循环
    muduo::net::TcpServer _server; // tcp服务器
};

int main()
{
    TranslateServer server(8085);
    server.start();
    
    return 0;
}
